動詞與常用的方式:
一次圍繞著一個特定資源(e.g. 產品、人員), 使用 URL + HTTP 動詞進行組合,來操作指定的資源動作(CRUD...等,資源為 server 上的 Object, Document, Thing...)
server 和 client 不需要知道雙方狀態, 每次都為獨立的請求, 當 Server 和 Client 個別代碼有調整時, 不會互相影響
GET product/21
Accept text/html, appliaction/html
HTTP/1.1 200 (OK)
Content-Type: text/html
參考: What is REST?
# a. 使用 Closure 回傳 html 頁面
Route::get('/', function(){
return view('product.list')
});
# b. 配合 Controller 回傳內容
Route::get('/', 'productList@index');
# c. laravel 5.7 以後支援 tuple 語法
Route::get('/', [PorductController::class, 'index']);
相同路由上可使用不同 HTTP 動詞區隔要執行的動作
# 定義一個 GET 方法取得商品資訊
Route:get('/product', function(){
// 取得商品資訊
});
# 定義一個 POST 方法建立一個商品
Route::post('/product', function(){
// 新增一筆商品
});
基本用法
# 取得商品單一頁面內容
Route::get('/product/{id}', function($id){
$binding = [
'id'=> $id
];
return view('product.view', $binding);
});
選用參數
# 取得商品列表
Route::get('/productList/{page?}', function($page = 1){
$binding = [
'page'=> $page
];
return view('product.list', $binding);
});
正規式匹配路由參數
# 在路由後方呼叫 where 方法, 檢查 page 是否為數字
Route::get('/productList/{page}', function($page){
$binding = [
'page'=> $page
];
return view('product.list', $binding);
})->where('id', '[0-9]+');
# 匹配單一商品與商品留言
Route::get('/product/{id}/{comment_id}', function($id, $comment_id){
$binding = [
'id'=> $id,
'comment_id' => $comment_id
];
return view('product.commentView', $binding);
})->where([
'id' => '[0-9]+',
'comment_id' => '[0-9]+',
]);
# 常見的命名方式 物件 + 動作, e.g. product.view
Route::get('/product/{id}', function($id){
$binding = [
'id'=> $id
];
return view('product.view', $binding);
})->name('product.view');
# 5.1 以前的版本設定
Route::get('/product/{id}', [
'as' => 'product.view',
'uses' => 'ProductController@show'
]);
# 可在 HTML 模板裡面或 PHP 內呼叫方法 url() 或 route() 取得路徑url
# url() 需明確指示路徑
url('/product/'.$id);
# route 可以使用路由名稱與參數配合
# 第一種用法 /product/1
route('product.view', [1]);
# 第二種用法, 此用法參數順序可以調整
route('product.view', ['id' => 1];
# 第三種用法, 多的參數會放在 query 參數內
# /product/1?opt=a
route('product.view', ['id' => 1, 'opt' => 'a']);
將同一功能的路由分組, 可依前綴詞、命名空間、middleware 分類
Route::group(function(){
Route::get('/product/{id}', function($id){
return view('product.view');
});
Route::get('/porductList', function(){
return view('product.list');
});
});
Route::middleware('auth')->group(function(){
Route::get('managerProduct', function(){
return view('managerProduct');
});
});
# 5.4 之前的版本
Route::group(['middleware' => 'auth'], function(){
Route::get('managerProduct', function(){
return view('managerProduct');
});
});
# /manager/Porduct
Route::prefix('manager')->group([function(){
Route::get('Product', function(){
return view('manager.product');
});
});
# 在路由檔最後定義一個後備路由, 來捕捉所有匹配不到的路徑
Route::any('{anything}', 'NotFoundController')->where('anything', '*');
# Laravel 5.6 以上可以改為 fallback
Route::fallback(function(){
// ...
});
# 不同網域代表應用程式的不同區域
# 像是 slcak 每間公司會有自己的子網域
Route::domain('{account}.myapp.com')->group(function(){
Route::get('/', function($account){
// ...
});
});
Route::namespace('Manager')->group(function(){
Route::get('manager/Product', 'Product@list');
});
# 可以使用 route('manager.comments.show', [1]) 來得到 url
Route::name('manager.')->prefix('manager')->group(function(){
Route::name('comments.')->prefix('comments')->group(function(){
Route::get('{id}', function($id){
// ...
})->name('show');
});
});